// 定义管理购物车状态的Vuex模块
export default {
	// 为当前模块开启命名空间
	namespaced: true,

	// 模块局部state
	state: () => ({
		// 接收商品信息对象，约定通用格式为：{ goods_id, goods_name, goods_price, goods_count, goods_small_logo, goods_state }
		cart: JSON.parse(uni.getStorageSync('cart') || '[]')
	}),

	// 模块mutations
	mutations: {
		// 定义添加商品信息对象的mutation
		addToCart(state, goodsObj) {
			// 遍历cart数组以核实是否存在相同商品
			const match = state.cart.find(item => item.goods_id === goodsObj.goods_id)
			if (match) {
				// 若存在则值增加已存在商品的数量值
				match.goods_count++
			} else {
				// 否则将传入的商品信息对象加入到cart数组中
				state.cart.push(goodsObj)
			}

			// 将添加商品后的购物车数据cart数组存储至本地
			uni.setStorageSync('cart', JSON.stringify(state.cart))
		},

		// 定义修改商品列表项勾选状态
		updateGoodsState(state, argObj) {
			const match = state.cart.find(item => item.goods_id === argObj.id)
			// 返回匹配商品项后，将其勾选状态进行取反
			match.goods_state = !match.goods_state
			// 将修改后的cart数组存储至本地
			uni.setStorageSync('cart', JSON.stringify(state.cart))
		},

		// 定义修改商品列表项数量
		updateGoodsCount(state, argObj) {
			const match = state.cart.find(item => item.goods_id === argObj.id)
			// 返回匹配商品项后，将传入的最新数量值赋值给该项
			match.goods_count = argObj.newNum
			// 将修改后的cart数组存储至本地
			uni.setStorageSync('cart', JSON.stringify(state.cart))
		},

		// 定义删除商品列表项的mutation
		removeGoodsById(state, argObj) {
			// 通过filter将筛选后的数组赋值给state.cart
			state.cart = state.cart.filter(item => item.goods_id !== argObj.id)
			// 将修改后的cart数组存储至本地
			uni.setStorageSync('cart', JSON.stringify(state.cart))
		},

		// 定义全选按钮控制商品勾选状态的mutation
		updateAllState(state, argObj) {
			state.cart.forEach(item => item.goods_state = argObj.state)
			// 将修改后的cart数组存储至本地
			uni.setStorageSync('cart', JSON.stringify(state.cart))
		}
	},

	// 模块getters
	getters: {
		// 定义用于购物车选项角标，即购物车商品总数量的getter
		total(state) {
			return state.cart.reduce((accumulator, item) => accumulator + item.goods_count, 0)
		},

		// 定义用于结算按钮旁的已勾选商品总数
		selectedAmount(state) {
			return state.cart
				.filter(item => item.goods_state === true)
				.reduce((accumulator, item) => accumulator + item.goods_count, 0)
		},

		// 定义用于控制全选按钮勾选状态的getter
		fullChecked(state) {
			return !state.cart.some(item => item.goods_state === false)
		},


		// 定义用于显示已勾选商品总价的getter
		selectedPrice(state) {
			return state.cart
				.filter(item => item.goods_state === true)
				.reduce((accumulator, item) => accumulator + item.goods_count * item.goods_price, 0)
				.toFixed(2)
		},

		// 定义结算订单的商品信息对象，需根据后端接口文档定制属性名
		orderGoodsInfo(state) {
			state.cart
				// 先筛选出包含已勾选商品的数组
				.filter(item => item.goods_state)
				// 然后通过map返回新数组，新数组元素为原数组元素调用所定义函数的结果，即返回后端要求的商品信息对象
				.map(item => ({
					goods_id: item.goods_id,
					goods_number: item.goods_count,
					goods_price: item.goods_price
				}))
		}
	},

}
